/***********************************************************************
 * Module:  Image.java
 * Author:  Fabien Muguet
 * Purpose: Defines the Class Image
 ***********************************************************************/

package modele;

import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.*;
import javax.imageio.ImageIO;
import main.Outils;

/**
 * Classe représentant une image au sein de l'application.
 * @author Administrateur
 */
public class Image {

   private static int idImageStockee = 0;
   private String dossierStockage;

   private String cheminFichier;
   private String sourceFichier;
   private Date dateCliche;
   private BufferedImage image;

   private BufferedImage miniature;
   private String nomFichier;

   /**
    * Charge une image en mémoire et garde une référence vers l'image initiale.
    * @param cheminFichier
    * @param sourceFichier
    * @param dateCliche
    * @param image
    */
   public Image(String cheminFichier, String sourceFichier, Date dateCliche, BufferedImage image) {
        this.cheminFichier = cheminFichier;
        this.sourceFichier = sourceFichier;
        this.dateCliche = dateCliche;
        this.image = image;
        this.miniature = null;
        this.nomFichier = null;
        if(Outils.getSystemName().contains("Windows"))
            this.dossierStockage = "C:/Windows/Temp/";
        else
            this.dossierStockage = "/tmp";

    }


    /**
     * Retourne un nom de fichier non encore utilisé.
     * @return Un nom de fichier non encore utilisé.
     */
    private static String creerNomFichierPourStockage() {
        idImageStockee++;
        return "image" + idImageStockee + ".jpg";
    }

    /**
     * Supprime toutes les images stockées en mémoire.
     */
    private static void supprimerImagesStockees() {
        // T0D0 - Suppression dans le dossier
        idImageStockee = 0;
    }


    /**
     * Créer une miniature aux dimensions données.
     * @param Dimensions maximales de la miniature.
     */
    public void creerMiniature(Dimension cadre) {
        miniature = Outils.ajuster(image, cadre);
    }

    /**
     * Indique la présence d'une miniature.
     * @return Vrai s'il y a une miniature, faux sinon.
     */
    public boolean miniatureExiste() {
        return miniature == null;
    }

    /**
     * Supprime la miniature.
     */
    public void supprimerMiniature() {
        miniature = null;
    }


    /**
     * Enregistre l'image en mémoire.
     */
    public void enregistrerEnMemoire() {
        try {
            if(nomFichier == null)
                nomFichier = creerNomFichierPourStockage();
            File file = new File(dossierStockage, nomFichier);
            ImageIO.write(image, "jpg", file);
            
            image.flush();
            image = null;
        } catch (IOException e) {
            System.out.println("[ERREUR] Impossible d'enregistrer l'image.");
            e.printStackTrace();
        }
    }

    /**
     * Indique si l'image est enregistree en mémoire.
     * @return Vrai si l'image est enregistree en mémoire, faux sinon.
     */
    public boolean estEnregistreeEnMemoire() {
        return image == null;
    }

    /**
     * Charge l'image depuis son emplacement en mémoire.
     */
    public void chargerDepuisMemoire() {
        
       try {
           File file = new File(dossierStockage, nomFichier);
           image = ImageIO.read( file );
       }
       catch(Exception ex) {
           System.out.println("[ERREUR] Impossible de charger l'image depuis la memoire.");
       }
    }



    /**
     * Retourne l'image, ou null si elle est enregistrée en mémoire.
     * @return L'image, ou null si elle est enregistrée en mémoire.
     */
    public BufferedImage getImage() {
        return image;
    }

    /**
     * Retourne l'image ou alors une miniature si l'image est enregistrée en mémoire.
     * @return L'image ou alors une miniature si l'image est enregistrée en mémoire.
     */
    public BufferedImage getImageOuMiniature() {
        if( image != null )
            return image;
        else if( miniature != null )
            return miniature;
        else
            return null;
    }


    /**
     * Récupère le chemin du fichier
     * @return Chemin du fichier.
     */
    public String getCheminFichier() {
        return cheminFichier;
    }

    /**
     * Initialise le chemin du fichier.
     * @param cheminFichier Chemin du fichier.
     */
    public void setCheminFichier(String cheminFichier) {
        this.cheminFichier = cheminFichier;
    }

    /**
     * Récupère la date du cliché.
     * @return Date du cliché.
     */
    public Date getDateCliche() {
        return dateCliche;
    }

    /**
     * Initialise la date du cliché.
     * @param dateCliche Date du cliché.
     */
    public void setDateCliche(Date dateCliche) {
        this.dateCliche = dateCliche;
    }

    /**
     * Initialise l'image.
     * @param image L'image
     */
    public void setImage(BufferedImage image) {
        this.image = image;
    }

    /**
     * Récupère le chemin du fichier source.
     * @return Chemin du fichier source.
     */
    public String getSourceFichier() {
        return sourceFichier;
    }

    /**
     * Initialise le chemin du fichier source.
     * @param sourceFichier Chemin du fichier source.
     */
    public void setSourceFichier(String sourceFichier) {
        this.sourceFichier = sourceFichier;
    }

}